r_main$0400rESIDENT CODE. tWO jmp'S @ $0400 THEN SKIP
TO $07FC TO LEAVE ROOM FOR SCREEN MEMORY.
tHIS MODULE CONTAINS ALL THE CODE THAT MUST
ALWAYS BE AVAILABLE. aLL THE OTHER MODULES
USE THE SUBROUTINES CONTAINED HERE.
1r_file$4EC7hIGH LEVEL DISK FILE STUFF (rENAME, oPEN, ETC).
2r_da*$75D8rUN'S da'S. *lOADS INSIDE fg_buffer ON 64
OR screen_base ON THE 128. tHIS KEEPS IT
FROM OVERWRITING bASIC'S CODE.
3r_init$4EC7GEOBASIC iNITIALIZATION CODE. lOADED FROM
rESIDENT CODE.
4r_load$7501bASIC pROGRAM LOADER. lOADS INTO fg_buffer
(SEE r_da).
5r_bint$4F96iNTERPRETER (bASrES). tHIS IS THE MODULE THAT
ACTUALLY RUNS THE USER'S PROGRAM.
6r_bint2$0400
7r_font$6F8BfONT mANAGER (CfONT, CsYSiNFO, AND
gETdISKbITMAP).
8r_disk$6F8BlOWER LEVEL DISK STUFF (READING BYTES, ETC).
9r_print$6F8BpRINTER rOUTINES.
10r_menu$4EC7mENU uTILITY.
11r_dbox$4EC7dIALOG bOX uTILITY.
12r_icon$4EC7iCON uTILITY.
13r_bmap$4EC7bITMAP uTILITY.
14r_sprt$4EC7sPRITE uTILITY.
15r_edit$4503eDITOR.
16r_appl$4B00mAKE aPPLICATION (RUN-TIME).
17r_debug$47CCdEBUGGER.
@gb pROGRAM, dISK lAYOUT
@rECORDS 0 TO 9 -
LEFT EMPTY TO LEAVE ROOM FOR gb CODE WHEN MAKING RUN-TIME.
@rECORD #10 -
vlir TABLE. kEEPS TRACK OF WHAT MODULES HOLD WHAT LINE #'S. uSED FOR DOING THE vlir SPLITTING. tHE TABLE IS A SINGLE SECTOR AND THERE IS ONE EIGHT BYTE ENTRY FOR EACH PROGRAM MODULE. tHE ENTRIES HAVE THE FOLLOWING FORMAT:
.WORD ?; hIGHEST LINE NUMBER IN MODULE.
.WORD ?; lENGTH_OF_MODULE (IN BYTES)
.BYTE ?; NESTING_LEVEL
.BYTE ?; WRITE_STATUS
.BYTE ?; MODIFIED_STATUS
.BYTE null; TERMINATOR
tHE VERY FIRST ENTRY IS A BIT DIFFERENT. iT LOOKS LIKE THIS:
.WORD ???; (nulls)
.BYTE X; NUMBER OF ENTRIES IN THE vlir TABLE (NOT
; COUNTING THIS ONE WHICH IS ENTRY #0).
.BYTE X; NUMBER OF LABELS IN THE LABEL TABLE (MINUS 1,
; LABELS ARE NUMBERED FROM ZERO!). iF THERE
; ARE NO LABELS THEN IT EQUALS $FF.
.BYTE $F0?
.BYTE $F6?
.WORD ???
@rECORD #11 -
oBJECT TABLE. aLL OF THE GEOS OBJECTS ARE STORE IN THIS RECORD, ONE RIGHT AFTER THE OTHER.
@rECORD #12 -
lABEL tABLE. hERE IS WHERE THE LABELS (@XXXX AND OBJECT NAMES) ARE STORED. eACH LABEL ENTRY IS 8 BYTES LONG AND HAS THE FOLLOWING FORMAT:
.WORD ADDRESS; WHERE IN MEMORY THE OBJECT IS LOCATED.
@rECORD #13 ONWARD -
hOLDS THE BASIC PROGRAM LINES. eACH LINE HAS THE FOLLOWING FORMAT:
.BYTE; LENGTH_OF_LINE
.WORD; LINE_NUMBER
.BLOCK ???; NOW COMES THE TOKENIZED TEXT
.BYTE null; TERMINATOR
@rECORD #126 BACKWARD -
dISK LOADABLE BITMAPS ARE STORED BEGINNING AT RECORD #126. aDDITIONAL BITMAPS ARE ADDED BACKWARDS UNTIL THEY MEET UP WITH THE PROGRAM RECORDS. nOTE THAT
DISK LOADABLE BITMAPS ARE STORED HERE. rEGULAR BITMAPS ARE STORED IN THE oBJECT tABLE (RECORD #11).
@gETTING rEGISTERS AFTER A call:
aFTER USING THE call COMMAND USE CAN GET THE RETURN VALUES OF THE REGISTERS BY peekING THE FOLLOWING MEMORY LOCATIONS:
@a=
$28A (650)
@x =
$28B (651)
@y=
$28C (652)
@sr=
$28D (653)
@pop cOMMAND:
tHE OLD (v1.0) pOP COMMAND HAD SEVERAL SERIOUS BUGS THAT CAUSED A SYSTEM CRASH. tHE NEW VERSION WORKS LIKE THIS: EXECUTING A pop WILL REMOVE THE CURRENT gosub/while/repeat STACK FRAME. iN OTHER WORDS IT WILL ALLOW YOU TO 'FORGET' THAT YOU ARE IN A SUBROUTINE OR LOOP (THIS DOES NOT APPLY TO A for...next LOOP). oNE THING TO KEEP IN MIND IS THAT AFTER EXECUTING A pop YOU MUST NOT ALLOW THE PROGRAM TO REACH THE return/loop/until COMMANDS. tHE BEST WAY OF DOING THIS IS WITH A CONSTRUCT LIKE THIS:
10 gosub dOsOMETHING
20 end
50 @dOsOMETHING
60 <VARIOUS COMMANDS>
70 if SOMETHING = ERROR then pop : goto @dOeRROR
80 return
100 @dOeRROR
110 .... ETC
oF COURSE IF YOU ARE TWO LEVELS DEEP IN A SUBROUTINE AND EXECUTE A pop, THEN YOU EXECUTE A return THE PROGRAM WILL RETURN two LEVELS BACK RATHER THEN JUST ONE. cOULD COME IN HANDY AT TIMES.
@gb vARIABLES - ZERO PAGE
nAMEaDDRESSsIZEdESCRIPTION
BAScUR$81/129WORDCURRENT CHARACTER IN BASIC MEMORY
BASbEGIN$83/131WORDPOINTER TO BEGINNING OF BASIC
BASICeND$85/133WORDPOINTER TO BEGINNING OF LABELS (MINUS 1 FOR END OF BASIC)
VARbEGIN$87/135WORDPOINTER TO THE BEGINNING OF
VARIABLES
ARRAYbEGIN$89/137WORDPOINTER TO THE BEGINNING OF ARRAYS
ARRAYeND$8B/139WORDPOINTER TO THE END OF ARRAYS
ARRAYlENGTH$8D/141WORDLENGTH OF ARRAY/TEMPORARY REGISTER
STRNbEGIN$8F/143WORDPOINTER TO THE BEGINNING OF STRINGS
ZEROsHIFT$91/145BYTEUSED BY FLOATING POINT ROUTINES
DEC_PT$92/146BYTEUSED BY FLOATING POINT ROUTINES
VARpTR$93/147WORDPOINTER TO VALUE OF VARIABLE
MACHINE_TYPE$95/149BYTE0 IF C64, $80 IF 128
STRNsTACK$96/1509 BYTESSTACK FOR THREE TEMP STRING DESCRIPTORS
STRNsTKiNDX$9F/159BYTEINDEX INTO STRNsTACK
PREVsTRNsTKiNDX$A0/160BYTEPREVIOUS STRNsTACK INDEX
RDiNDEX$A1/161BYTEINDEX TO READING IN STRINGS
GAX2$A2/162WORD(NOT COMMENTED IN SOURCE CODE)
CURsTRN$A4/164WORDPOINTER TO MOST CURRENT STRING THAT
WAS ADDED OR MOVED.
STRNdES$A6/166WORDPOINTER TO STRING DESCRIPTOR
DESCpTR$A8/168WORDPOINTER TO STRING DESCRIPTOR FOR STRING OPERATIONS.
GEOSbEGIN$AA/170WORDPOINTER TO THE BEGINNING OF OBJECT
(MENUS, ICONS, ETC.) DATA.
MEMaMNT$AC/172WORDAMOUNT OF MEMORY TO INSERT OR DELETE
CURkEYbRDpOS$AE/174WORD(NOT COMMENTED IN SOURCE)
sETfORiotEMP$B0/176WORD(NOT COMMENTED IN SOURCE)
CURlINEnUM$B2/178WORDCURRENT LINE NUMBER BEING EXECUTED OR
$FF IN DIRECT MODE
vlirTABL$B4/180WORDPOINTER TO BEGINNING OF vlir TABLE
XpOS$B6/182WORDx POSITION FOR print
YpOS$B8/184BYTEy POSITION FOR print
OPmASK$B9/185BYTECURRENT COMPARISON BEING PERFORMED
>/1, =/2, </4 OR ANY COMBO OF THESE
COMM_fLAG$BA/186BYTEFLAG FOR WHICH COMMAND IS CURRENTLY
BEING EXECUTED: 0 = NONE, 1 = run,
-1 = list - USED BY THE eDITOR
DATApTR$BC/188WORDPOINTER IN BASIC TO data STATEMENTS
fp_SGNS$BE/190BYTETEMP FLAG FOR SIGN OF fp NUMBER
EXP_FOUND$BF/191BYTEFLAG FOR WHETHER EXPONENT WAS FOUND
FONTbEGIN$C0/192WORDPOINTER TO BEGINNING OF FONT
LASTfONTpTR$C2/194WORD(NOT COMMENTED IN SOURCE)
CURdbpTR$C4/196WORDPOINTER TO CURRENT DIALOG BOX DATA